package com.example.ad.sdk.configs
import com.example.ad.sdk.domain.models.ConfigModel

/**
 * 广告配置类
 *
 * 用于存储和管理广告SDK所需的配置信息。
 * 使用Builder模式构建配置对象，确保配置项在创建后不可更改。
 */
class AdConfig {
    /** 应用ID，用于标识应用程序 */
    val appId: String
    
    /** 应用名称，用于标识应用程序的显示名称 */
    val appName: String
    
    /** 调试模式开关，true表示开启调试日志，false表示关闭 */
    val debug: Boolean
    
    /**
     * 私有构造函数
     *
     * 只能通过内部的Builder类来创建AdConfig实例，
     * 确保对象一旦创建后其属性不可修改。
     *
     * @param config 配置模型对象，包含所有需要的配置信息
     */
    private constructor(config: ConfigModel) {
        appId = config.appId
        appName = config.appName
        debug = config.debug
    }

    /**
     * AdConfig的Builder类
     *
     * 使用Builder模式来逐步构建AdConfig对象。
     * 提供链式调用方式设置各项配置参数。
     */
    object Builder {
        /** 内部使用的配置模型，用于暂存配置信息 */
        private val model = ConfigModel()

        /**
         * 设置应用ID
         *
         * @param appId 应用唯一标识符
         * @return Builder实例，支持链式调用
         */
        fun setAppId(appId: String): Builder{
            model.appId= appId
            return this
        }

        /**
         * 设置应用名称
         *
         * @param appName 应用显示名称
         * @return Builder实例，支持链式调用
         */
        fun setAppName(appName: String): Builder{
            model.appName= appName
            return this
        }
        
        /**
         * 设置调试模式
         *
         * @param debug 调试模式开关，true表示开启调试，false表示关闭调试
         * @return Builder实例，支持链式调用
         */
        fun setDebug(debug: Boolean): Builder{
            model.debug= debug
            return this
        }

        /**
         * 构建AdConfig实例
         *
         * 将Builder中设置的配置信息构建成一个不可变的AdConfig对象。
         *
         * @return 配置完成的AdConfig实例
         */
        fun build(): AdConfig{
            return AdConfig(model)
        }
    }
}